package org.jeecg.modules.product.job.report.controller;

import freemarker.cache.ClassTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.jeecg.modules.product.job.report.entity.FreemarkerTemplateEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.*;

@Tag(name="电子作业票模版")
@RestController
@RequestMapping("freemarker")
public class ReportController {

    @Autowired
    private FreeMarkerViewResolver freeMarkerViewResolver;
    private final Configuration cfg;

    public ReportController() throws IOException {
        cfg = new Configuration(Configuration.VERSION_2_3_31);
        // 设置模板的加载路径，这里假设模板文件放在src/main/resources/templates下
        // 注意：FreeMarker的ClassLoaderTemplateLoader可能不适用于从JAR文件中加载模板
        // 你可以使用FileTemplateLoader，但需要注意在部署时模板文件的路径
        // 这里为了示例，我们使用ClassTemplateLoader，它通常用于开发环境
        cfg.setTemplateLoader(new ClassTemplateLoader(getClass(), "/templates"));
        cfg.setDefaultEncoding("UTF-8");
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
        cfg.setLogTemplateExceptions(false);
        cfg.setWrapUncheckedExceptions(true);
        cfg.setFallbackOnNullLoopVariable(false);
    }

    @Operation(summary="电子作业票-模版导出下载")
    @GetMapping("/generateReportAndDownload")
    public ResponseEntity<ByteArrayResource> generateReportAndDownload() throws IOException, TemplateException {
        // 准备数据模型
        Map<String, Object> dataModel = new HashMap<>();
        dataModel.put("reportTitle", "Monthly Sales Report");
        dataModel.put("reportDate", "2023-04-01"); // 确保这里有一个正确的日期值
        List<FreemarkerTemplateEntity> freemarkerTemplateEntityLis = new ArrayList<>();
        freemarkerTemplateEntityLis.add(new FreemarkerTemplateEntity("Item 1", "Description 1"));
        freemarkerTemplateEntityLis.add(new FreemarkerTemplateEntity("Item 2", "Description 2"));
        dataModel.put("items", freemarkerTemplateEntityLis);

        // 读取图片文件并转换为BASE64
//        String imagePath = "D:\\soft\\document\\images\\wanxia.jpg";
//        byte[] imageBytes = Files.readAllBytes(Paths.get(imagePath));
//        String imageBase64 = Base64.getEncoder().encodeToString(imageBytes);
//        dataModel.put("imageBase64", imageBase64);
        // ... 添加更多数据到模型中

        // 使用FreeMarker生成报告内容
        Template template = cfg.getTemplate("HotWorkingTemplate.ftl");
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try (Writer fileWriter = new OutputStreamWriter(out, "UTF-8")) {
            template.process(dataModel, fileWriter);
        }

        // 设置HTTP响应头以指示文件下载
        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"report.doc\""); // 注意：这里假设生成的是.doc文件，如果是.docx或其他格式，请相应更改
        headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE);

        // 创建并返回ResponseEntity
        ByteArrayResource resource = new ByteArrayResource(out.toByteArray()) {
            @Override
            public boolean exists() {
                // 必须重写此方法，否则Spring会在调用getInputStream时检查文件是否存在
                return true;
            }
        };
        return ResponseEntity.ok()
                .headers(headers)
                .contentLength(out.size())
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
                .body(resource);
    }



    @GetMapping("/generateReport")  
    public String generateReport(Model model) {  
        // 创建数据模型  
        Map<String, Object> reportData = new HashMap<>();  
        reportData.put("reportTitle", "Monthly Sales Report");  
        reportData.put("reportDate", new Date());
  
        List<Map<String, String>> items = new ArrayList<>();  
        Map<String, String> item1 = new HashMap<>();  
        item1.put("name", "Product A");  
        item1.put("description", "Description of Product A");  
        items.add(item1);  
  
        // 添加更多项目...  
  
        reportData.put("items", items);  
  
        // 将数据模型添加到Model中，并指定模板名称  
        model.addAllAttributes(reportData);  
        return "report"; // 模板文件名（不含.ftl扩展名）  
    }

//    @GetMapping("/renderTemplate")
//    @ResponseBody
//    public void renderTemplate(HttpServletResponse response) throws IOException {
//        response.setContentType("text/html;charset=UTF-8");
//        PrintWriter out = response.getWriter();
//
//        // Prepare the model data
//        Map<String, Object> model = new HashMap<>();
//        model.put("title", "Hello FreeMarker");
//        model.put("message", "This is a message from FreeMarker template!");
//
//        // Render the template
//        String templateName = "example"; // No need to add .ftl suffix
//        freeMarkerViewResolver.getConfiguration().getTemplate(templateName + ".ftl")
//                .process(model, out);
//
//        out.flush();
//        out.close();
//    }
}